Librerías

Un vistazo a gapminder

¿cuál es la estructura de gapminder?

 str(gapminder)
## Classes 'tbl_df', 'tbl' and 'data.frame':    1704 obs. of  6 variables:
##  $ country  : Factor w/ 142 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ continent: Factor w/ 5 levels "Africa","Americas",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ year     : int  1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 ...
##  $ lifeExp  : num  28.8 30.3 32 34 36.1 ...
##  $ pop      : int  8425333 9240934 10267083 11537966 13079460 14880372 12881816 13867957 16317921 22227415 ...
##  $ gdpPercap: num  779 821 853 836 740 ...

Gráfico paso a paso ¿Lo hacemos en capas?

Paso 1: datos

# el símbolo <- representa asignación, por lo que podemos guardar nuestro gráfico en una variable o directamente eecutarlo, como lo hicimos anteriormente.
p <- ggplot(data = gapminder)

Importante:cada vez que querramos agregar una capa utilizamos el operador +.

Paso 2: Atributos estéticos

Elegimos la variable continent para relacionarla con el atributo color, es decir, color=continent, por el cual se asignará un color por cada valor distinto de la variable continente. Y a la variable pop, o población la relacionamos con el atributo size (tamaño).

#out.width="100%"
p <- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp, color=continent))
p

Paso 3: Función Geom

p + geom_point()

# p<- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp, color=continent)) +
#   geom_point()
p

En la figura anterior podemos observar la relación existente entre el ingreso bruto per cápita y la esperanza de vida de cada país.

Paso 4: Sistemas de coordenadas y escalas

# A partir de acá comenzaremos a codear el gráfico completo para que se a más claro el proceso:

 # p + coord_cartesian()+
 #   scale_x_log10()

p <- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp,color = continent))+
  geom_point()+
  coord_cartesian()+
  scale_x_log10()
 
p

Paso 5: Etíquetas y guías

# p +  labs(x = "Ingreso (GDP) Per Capita", y = "Esperanza de vida en años",
#        title = "Relación entre el ingreso per cápita y y esperanza de vida",
#        subtitle = "Los puntos se representan por año-país",
#        caption = "DataSource: Gapminder.")+
   #guides(color = guide_legend(override.aes = list(size = 5)))

ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp,color = continent))+ 
    geom_point()+
    coord_cartesian()+
    scale_x_log10()+
   labs(x = "Ingreso (GDP) Per Capita", y = "Esperanza de vida en años",
       title = "Crecimiento económico y esperanza de vida",
       subtitle = "Los puntos se representan por año-país",
       caption = "DataSource: Gapminder - Link: https://www.gapminder.org")+
   guides(color = guide_legend(override.aes = list(size = 5)))
  
  # con la capa de 'labs' o 'etiquetas' agrego título, subtítulot y el caption al gráfico.
# con la capa de 'guides' o 'guía' le asigno formato a las formas (puntos) de la leyenda correspondiente a la variable continente.

6-Paleta de colores

¿Y si queremos cambiar el color?

Existen muchas paletas y cada una ofrece diferentes opciones, por ejemplo la paleta RColorBrewer ofrece las siguientes:

library(RColorBrewer)

# Todas las opciones
display.brewer.all()

# Las opciones de paletas cualitativas
display.brewer.all(type = "qual")

Probamos la opción Set2

pSet2 <- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp,color = continent))+ 
  geom_point()+
  scale_color_brewer(palette="Set2")+
  coord_cartesian()+
  scale_x_log10()+
   labs(x = "Ingreso (GDP) Per Cápita", y = "Esperanza de vida",
       title = "Crecimiento económico y esperanza de vida",
       subtitle = "Los puntos se representan por año-país",
       caption = "DataSource: Gapminder - Link: https://www.gapminder.org")+
   guides(color = guide_legend(override.aes = list(size = 5)))

pSet2

Probamos la opción Dark2

pdark2 <- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp,color = continent))+ 
  geom_point()+
  scale_color_brewer(palette="Dark2")+
  coord_cartesian()+
  scale_x_log10()+
   labs(x = "Ingreso (GDP) Per Cápita", y = "Esperanza de vida",
       title = "Crecimiento económico y esperanza de vida",
       subtitle = "Los puntos se representan por año-país",
       caption = "DataSource: Gapminder - Link: https://www.gapminder.org")+
   guides(color = guide_legend(override.aes = list(size = 5)))

pdark2 

¿ Y si queremos trabajar con nuestra propia paleta de colores?

pmanual <- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp,color =            continent))+ 
    geom_point()+
    scale_color_manual(values = c("#41b6a6", "#f6e37c",   "#f5a26b","#51b8df","#713580"), labels = c("Africa", "América","Asia",  "Europa", "Oceanía"))+
    coord_cartesian()+
    scale_x_log10()+
    labs(x = "Ingreso (GDP) Per Cápita", y = "Esperanza de vida",
       title = "Crecimiento económico y esperanza de vida",
       subtitle = "Los puntos se representan por año-país",
       caption = "DataSource: Gapminder - Link: https://www.gapminder.org")+
   guides(color = guide_legend(override.aes = list(size = 5)))

pmanual

7-Temas

Para cambiar la apariencia del gráfico podemos agregar otra capa con un tema en particular, existen temas que vienen ya incluidos en ggplot2 como, por ejemplo:

  • theme_bw()
  • theme_minimal()
  • theme_dark()
  • theme_gray()
ptheme <- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp,color =            continent))+ 
    geom_point()+
    scale_color_manual(values = c("#41b6a6", "#f6e37c",   "#f5a26b","#51b8df","#713580"), labels = c("Africa", "América","Asia",  "Europa", "Oceanía"))+
    coord_cartesian()+
    scale_x_log10()+
    labs(x = "Ingreso (GDP) Per Cápita", y = "Esperanza de vida",
       title = "Crecimiento económico y esperanza de vida",
       subtitle = "Los puntos se representan por año-país",
       caption = "DataSource: Gapminder - Link: https://www.gapminder.org")+
   guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_classic()
 
ptheme

¿Probamos otro Theme?

p_theme_bw <- ggplot(data = gapminder,mapping = aes(x = gdpPercap,y = lifeExp,color = continent))+ 
    geom_point()+
    scale_color_manual(values = c("#41b6a6", "#f6e37c",   "#f5a26b","#51b8df","#713580"), labels = c("Africa", "América","Asia",  "Europa", "Oceanía"))+
    coord_cartesian()+
    scale_x_log10()+
    labs(x = "Ingreso (GDP) Per Cápita", y = "Esperanza de vida",
       title = "Crecimiento económico y esperanza de vida",
       subtitle = "Los puntos se representan por año-país",
       caption = "DataSource: Gapminder - Link: https://www.gapminder.org")+
   guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_grey()

p_theme_bw

¿Cómo mejoramos la apariencia del gráfico?

  • Renombrando las etiquetas de los valores de la leyenda correspondientes a la variable continente y cambiando su posición.

  • Cambiando la apariencia de las etiquetas del eje ‘x’ mediante la escala scale_x_log10.

  • Cambiando el tamaño y la fuente de los ejes ‘x’ e ‘y’.

Manos a la obra

p_refinado <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp, color=continent))+
  geom_point(size=3,alpha=0.6)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
       title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.", color= '', fill="Población")+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_classic()+
  theme(legend.position="bottom")
 
p_refinado 

Siempre es posible mejorar algún aspecto del gráfico

Ahora vamos a cambiar el color de las etiquetas de la leyenda correspondiente a la variable continente y también le quitaremos el recuadro gris.

p_refinado2 <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp, color=continent))+
  geom_point(size=3,alpha=0.6)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
       title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.", color= " ", alpha=" ")+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_light()+
  theme(legend.position="bottom", legend.key= element_rect(fill="NA"),
        legend.text= element_text(color="#2c204d", 
                                  size= 14), 
        legend.justification = "center")
p_refinado2

Customizando el theme.

En el siguiente paso vamos a customizar el theme o tema, para lo cual definiremos dos parámetros text_size y margin_size, que luego utilizaremos para modificar el tamaño del título, subtítulo y leyenda.

#Para no repetir los mismos valores de tamaño en el theme, defino dos variable que utilizaré en el theme del gráfico.

text_size <-16   # tamaño base del texto
margin_size <- text_size/2  #de los margenes

pTheme_final <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp, color= continent))+
  geom_point(size=3,alpha=0.6)+
  #geom_point(aes(color=continent))+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
       title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.", color= '', fill="Población")+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_light()+
  theme(legend.position="bottom", legend.key= element_rect(fill='NA'),
        legend.text= element_text(color="#2c204d", 
                                  size= text_size), 
        legend.justification = "center",
        
        plot.title = element_text(size=(text_size * 1.8),family ="Garamond",    
                              hjust = 0.5,vjust = 1,
                              colour = "#2c204d", #
                              face = 'bold', 
                              margin = margin(b = margin_size * 1.2)),
        plot.subtitle = element_text(size = text_size * 1.3,
                             family ="Garamond", hjust = 0.5, vjust = 1, 
                             colour = "#2c204d",
                            margin = margin(b = margin_size * 0.9)),
        plot.caption = element_text(size = 11,family ="Garamond",
                                    hjust = 1, vjust = 1,
                                    colour = "#2c204d", 
                                    face='bold',
                                    margin = margin(t = margin_size * 0.9)),
        panel.background = element_rect(fill = "white"),
        panel.grid.major = element_line(color = "gray90", size = 0.5),
        panel.grid.minor = element_line(color = "gray90", size = 0.25))
pTheme_final

¿Cómo guardamos lo hecho hasta aquí?

ggsave(here("grafico_scatterplot1.png"), height = 8, width = 10, units = "in", type='cairo')

¿Y si agregamos otra capa al gráfico?

El objetivo es agregar una curva suavizada al gráfico, entonces vamos a agregar una capa en donde utilizaremos la funcion geom geom_smooth. Entre los métodos a aplicar con dicha función tenemos:

  • geom_smooth(method = "gam")
  • geom_smooth(method = "lm")
  • geom_smooth(method = "glm")
  • geom_smooth(method = "loess")

En nuestro caso, utilizaremos la primera opción (method = “gam”) y además aprovecharemos este paso para customizar la capa del ´themeotema`, así obtendremos el siguiente gráfico:

text_size <-16   # tamaño base del texto
margin_size <- text_size/2  #de los margenes

# Guardamos el gráfico en el objeto pTheme_final
pTheme_final <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp))+
  geom_point(aes(color=continent),size=3,alpha=0.6)+
  geom_smooth(method = 'gam', col = "#2c204d", size = 0.7,
              fill = "gray60", alpha = 0.2)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
       title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.", color= '', fill="Población")+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_light()+
  theme(legend.position="bottom", legend.key= element_rect(fill='NA'),
        legend.text= element_text(color="#2c204d", 
                                  size= text_size), 
        legend.justification = "center",
        
        plot.title = element_text(size=(text_size * 1.8),family ="Garamond",    
                              hjust = 0.5,vjust = 1,
                              colour = "#2c204d", #
                              face = 'bold', 
                              margin = margin(b = margin_size * 1.2)),
        plot.subtitle = element_text(size = text_size * 1.3,
                             family ="Garamond", hjust = 0.5, vjust = 1, 
                             colour = "#2c204d",
                            margin = margin(b = margin_size * 0.9)),
        plot.caption = element_text(size = 11,family ="Garamond",
                                    hjust = 1, vjust = 1,
                                    colour = "#2c204d", 
                                    face='bold',
                                    margin = margin(t = margin_size * 0.9)),
        panel.background = element_rect(fill = "white"),
        panel.grid.major = element_line(color = "gray90", size = 0.5),
        panel.grid.minor = element_line(color = "gray90", size = 0.25))


# llamamos al objeto pTheme_final
pTheme_final

#Guardamos el gráfico 
ggsave(here("grafico_scatterplot_smooth.png"), height = 8, width = 10, units = "in", type='cairo')

8-Facetas

Vamos a separar por columnas con facet_wrap teniendo en cuenta la variable continente

p_facet <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp, color=continent))+
  geom_point(size=3,alpha=0.6)+
  geom_smooth(method = 'gam', col = "#2c204d", size = 0.7,
              fill = "gray60", alpha = 0.2)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
       title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.", color= '')+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_bw()+
  theme(legend.position="bottom")+
  facet_wrap(~continent, ncol = 2, scales="free") 

p_facet

# Guardamos el gráfico
ggsave(here("grafico_facet.png"), height = 8, width = 10, units = "in", type='cairo')

9-Paquete hrbrthemes

El paquete hrbrthemes ofrece varias opciones de temas para aplicar a un gráfico, algunas son:

  • theme_ipsum()
  • theme_ft_rc()
  • theme_ipsum_ps()
  • theme_ipsum_rc()
  • theme_ipsum_tw()

Utilizaremos la última opción, entonces obtendremos el siguiente gráfico:

# Cargó la librería, en este caso, voy a utilizar la opción theme_ipsum_tw()
library(hrbrthemes)
import_titillium_web
## function () 
## {
##     tw_font_dir <- system.file("fonts", "titillium-web", package = "hrbrthemes")
##     suppressWarnings(suppressMessages(extrafont::font_import(tw_font_dir, 
##         prompt = FALSE)))
##     message(sprintf("You will likely need to install these fonts on your system as well.\n\nYou can find them in [%s]", 
##         tw_font_dir))
## }
## <bytecode: 0x000000001dc55000>
## <environment: namespace:hrbrthemes>
p_facet_ipsum_tw <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp, color=continent))+
  geom_point(size=3,alpha=0.6)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
       title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.", color= '')+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_ipsum_tw()+
  theme(legend.position="bottom")+
  facet_wrap(~continent, ncol = 2, scales="free") 

p_facet_ipsum_tw

# ¿Guardamos el gráfico?
ggsave(here("grafico_facet_ipsum_tw.png"), height = 8, width = 10, units = "in", type='cairo')

En cambio, si utilizamos la primera opción, entonces obtendremos el siguiente gráfico:

p_facet_dark <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp, color=continent))+
  geom_point(size=3,alpha=0.6)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
       title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.", color= '')+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_ft_rc()+
  theme(legend.position="bottom")+
  facet_wrap(~continent, ncol = 2, scales="free") 

p_facet_dark

# Guardamos el gráfico
ggsave(here("grafico_facet_dark.png"), height = 8, width = 10, units = "in", type='cairo')

10-Paquete patchwork

Utilizaremos la librería patchwork para combinar dos gráficos (el gráfico pTheme_final con el gráfico facetado p_facet_ipsum_tw), pero antes debo generarlos nuevamente sin título, ni subtítulo ni caption, ya que esos elementos los agrego al unirlos con patchwork.

text_size <-16   # tamaño base del texto
margin_size <- text_size/2  #de los margenes

# generamos la primer figura p1

p1 <- ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp))+
  geom_point(aes(color=continent),size=3,alpha=0.6)+
  geom_smooth(method = 'gam', col = "#2c204d", size = 0.7,
              fill = "gray60", alpha = 0.2)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="Ingreso (PBI) Per Capita", y="Esperanza de vida en años",
        color= '')+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme(legend.position="bottom", legend.key= element_rect(fill='NA'),
        legend.text= element_text(color="#2c204d", 
                                  size= text_size), 
        legend.justification = "center",
        
        plot.title = element_text(size=(text_size * 1.8),family ="Garamond",    
                              hjust = 0.5,vjust = 1,
                              colour = "#2c204d", #
                              face = 'bold', 
                              margin = margin(b = margin_size * 1.2)),
        plot.subtitle = element_text(size = text_size * 1.3,
                             family ="Garamond", hjust = 0.5, vjust = 1, 
                             colour = "#2c204d",
                            margin = margin(b = margin_size * 0.9)),
        plot.caption = element_text(size = 11,family ="Garamond",
                                    hjust = 1, vjust = 1,
                                    colour = "#2c204d", 
                                    face='bold',
                                    margin = margin(t = margin_size * 0.9)),
        panel.background = element_rect(fill = "white"),
        panel.grid.major = element_line(color = "gray90", size = 0.5),
        panel.grid.minor = element_line(color = "gray90", size = 0.25))

p1

# Generamos la segunda figura

p2 <-ggplot(data=gapminder, mapping=aes(x= gdpPercap, y= lifeExp, color=continent))+
  geom_point(size=3,alpha=0.6)+
  scale_x_log10(labels= scales::dollar)+
  scale_color_manual(values= c("#41b6a6", "#f6e37c","#f5a26b","#51b8df","#713580"), labels= c("Africa", "America", "Asia","Europa", "Oceanía"))+
  labs(x="", y="Esperanza de vida en años", 
       color= '')+
  guides(color = guide_legend(override.aes = list(size = 5)))+
  theme_ipsum_tw()+
  theme(legend.position="none", axis.text.y = element_text(size = 12))+
  # con legend.position="none", elimino las leyendas de continente 
  facet_wrap(~continent, ncol = 2, scales="free") # 
p2

ggsave(here("grafico_p2.png"), height = 8, width = 10, units = "in", type='cairo')

Combinamos los dos últimos gráficos realizados (p1 y p2),

library(patchwork)

patchwork <- p2 / p1 +                          #combino ambos gráficos
  plot_annotation(title ="Crecimiento económico y esperanza de vida", subtitle ="Los puntos se representan por año-país" , caption = "DataSource: Gapminder- Link: https://www.gapminder.org.") &   
                  theme (plot.title = element_text(size = 18), plot.subtitle = element_text(size = 14), plot.caption = element_text(size = 14))  
# agrego título, subtítulo y caption
# defino el tamaño de las etiquetas

patchwork

### Guardamos el gráfico realizado con patchwork 
ggsave(here("grafico_patchwork.png"), height = 12, width = 14, units = "in", type='cairo')

Gráficos interactivos con Plotly

# Forma directa de utilizar plotly

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
ggplotly(pTheme_final)
## `geom_smooth()` using formula 'y ~ s(x, bs = "cs")'
ggplotly(p_facet)
## `geom_smooth()` using formula 'y ~ s(x, bs = "cs")'
ggplotly(p_facet_dark)

Referencias: